package com.swak.telnet.cmd;

import org.springframework.util.Assert;

import com.swak.utils.StringUtils;

/**
 * 行解析
 * 
 * @author DELL
 */
class CommandParser {

	Command parse(String command) {
		Assert.isTrue(command != null, "command == null");
		Command cmd = new Command();
		String[] tokens = command.split(" ");
		for (String token : tokens) {
			this.handleToken(cmd, StringUtils.trimToNull(token));
		}
		return cmd;
	}

	/**
	 * --K <br>
	 * --K=V<br>
	 * --K V<br>
	 * 
	 * -K <br>
	 * -K=V<br>
	 * -K V<br>
	 * 
	 * @param cmd
	 * @param token
	 */
	private void handleToken(Command cmd, String token) {

		// 不需要处理空字符串
		if (StringUtils.isBlank(token)) {
			return;
		}

		// 新的选项
		else if (this.isOption(token)) {
			String option = StringUtils.substringAfter(token, "-");
			String name = option, value = null;
			int pos = option.indexOf('=');
			if (pos > 0) {
				name = option.substring(0, pos);
				value = option.substring(pos + 1);
			}
			cmd.newOption(name).currentOption().addValue(value);
		}

		// 选项的值
		else if (cmd.currentOption() != null) {
			cmd.currentOption().addValue(token);
		}

		// 命令
		else if (StringUtils.isBlank(cmd.getCommand())) {
			cmd.setCommand(token);
		}

		// 参数
		else {
			cmd.getArgs().add(token);
		}
	}

	/**
	 * 是选项
	 * 
	 * @param token
	 * @return
	 */
	private boolean isOption(String token) {
		return StringUtils.startsWith(token, "-");
	}
}
